package m

import (
	"GameServer/Game/cache"
	"GameServer/Game/dbmodule"
	"GameServer/Game/errors"

	"github.com/globalsign/mgo/bson"
	log "github.com/sirupsen/logrus"
)

// 麦驰自研 支付订单信息
type MCPayOrder struct {
	BaseM
	Uid       bson.ObjectId `bson:"_id" json:"_id"`
	OrderTime int64         `bson:"orderTime" json:"orderTime"` // 订单时间

	OrderNum  string  `bson:"ordernum" json:"orderNum"`   // 充值订单号
	AppId     string  `bson:"appid" json:"appId"`         // 游戏编号
	AccountId string  `bson:"accountid" json:"accountId"` // 账号标识
	PayType   int64   `bson:"paytype" json:"payType"`     // 支付通道代码
	Amount    float64 `bson:"amount" json:"amount"`       // 支付金额

	Server    string `bson:"server" json:"server"`       // 服务器标识
	RoleId    string `bson:"roleid" json:"roleId"`       // 角色id
	ProductId string `bson:"productid" json:"productId"` // 商品id

	Extend        string `bson:"extend" json:"extend"`               // 游戏合作商自定义参数
	PaymentStatus string `bson:"paymentstatus" json:"paymentStatus"` // 订单状态
	ErrMsg        string `bson:"errmsg" json:"errMsg"`               // 订单失败原因详细描述
}

// 支付订单信息：创建
func NewMCPayOrder() cache.EntryI {
	return &MCPayOrder{}
}

// 支付订单信息：保存信息
func (po *MCPayOrder) Save() (err error) {
	err = dbmodule.MgoDB.GameDB.Upsert("MCPayOrder", bson.M{"_id": po.Uid}, po)
	return
}

// 支付订单信息：加载
func (po *MCPayOrder) Load(key interface{}) (err error) {
	switch key.(type) {
	case string:
		if key.(string) == "" {
			return errors.New("无效的key load, key empty")
		}
		po.Uid = bson.ObjectIdHex(key.(string))
	case bson.ObjectId:
		po.Uid = key.(bson.ObjectId)
	default:
		log.WithFields(log.Fields{
			"method": "PayOrder_Load",
			"data":   key,
		}).Error("无效的key load")
		return errors.New("无效的key load")
	}
	return po.LoadData()
}

// 支付订单信息：加载数据
func (po *MCPayOrder) LoadData() (err error) {
	err = dbmodule.MgoDB.GameDB.FindOne("MCPayOrder", bson.M{"_id": po.Uid}, nil, &po)
	if err != nil {
		if err.Error() == "not found" {
			return nil
		}
		return
	}
	return
}

// 支付订单信息：更新数据
func (po *MCPayOrder) Update(val *MCPayOrder) {
	Cache.Put("MCPayOrder", val.Uid.Hex(), val)
	val.UpdateData()
}
